package cn.tedu.charging.order.rabbitmq;


import cn.tedu.charging.order.common.OrderStatusConstants;
import cn.tedu.charging.order.config.RabbitMQConfiguration;
import cn.tedu.charging.order.dao.mapper.OrderSuccessMapper;
import cn.tedu.charging.order.pojo.po.ChargingOrderSuccessPO;
import cn.tedu.charging.order.pojo.po.OrderMQPO;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@Slf4j
@Component
public class RabbitMQConsumer {
    @Autowired
    private OrderSuccessMapper orderSuccessMapper;

    //@RabbitListener(queues = RabbitMQConfiguration.QUEUE_NAME)
    @RabbitListener(queues = RabbitMQConfiguration.DEAD_LETTER_QUEUE_NAME)
    public void receive(OrderMQPO orderMQPO, Message message, Channel channel){
        System.out.println("处理延迟消息:"+orderMQPO);
        // TODO: 处理消息
        //1 先查询  sql
        //2 判断状态
        //3 如果是充电中 修改为异常结束 sql
        //update 成功订单表 set 充电状态 = 异常结束 where 订单号 = 订单号 and 充电状态 = 充电中
        //更新的目标值  set 充电状态 = 异常结束
        ChargingOrderSuccessPO chargingOrderSuccessPO = new ChargingOrderSuccessPO();
        chargingOrderSuccessPO.setBillStatus(OrderStatusConstants.ORDER_STATUS_EXCEPTION_END);
        // 设置更新条件
        UpdateWrapper updateWrapper = new UpdateWrapper();
        // 设置条件 订单的订单号
        updateWrapper.eq("bill_id",orderMQPO.getOrderNo());
        // 充电中
        updateWrapper.eq("bill_status",OrderStatusConstants.ORDER_STATUS_PROCESS);
        // 更新数据
        log.debug("处理延迟消息-更新数据:{},条件:{}",chargingOrderSuccessPO,updateWrapper);
        int row = orderSuccessMapper.update(chargingOrderSuccessPO, updateWrapper);
        log.debug("处理延迟消息-更新数据:{},条件:{},影响行数:{}",chargingOrderSuccessPO,updateWrapper,row);
        // 进一步处理
        if(row==0){
            log.debug("没有更新数据，表示订单正常结束");
        }else {
            log.debug("更新数据，表示订单异常结束");
            // 通知用户 通知管理员
            log.debug("通知用户");
            log.debug("通知管理员");
        }

        // 手动确认消息 ack 确认消息，消费者完成业务后告诉RabbitMQ消息已经处理完成，可以删除消息了
        try {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        }catch (Exception e){
            log.error("确认消息失败:{}",e);
        }

    }
}
